This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.
Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Ctrl+Shift+Enter.
Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Ctrl+Alt+I.
When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Ctrl+Shift+K to preview the HTML file).
library(sqldf)
Loading required package: gsubfn
Loading required package: proto
Loading required package: RSQLite
## see first 6 rows of the dataset
head(realDT)
## tail(realDT)
## check number of rows and columns
nrow(realDT)
[1] 38762
ncol(realDT)
[1] 7
## check date range of tweets
summary(realDT)
source
Twitter for Android:14545
Twitter Web Client :12182
Twitter for iPhone :10332
TweetDeck : 483
TwitLonger Beta : 405
Media Studio : 156
(Other) : 659
text
MAKE AMERICA GREAT AGAIN! : 27
For all of those who have been asking about online sales the Donald J. Trump Signature Collection ties & shirts are sold @Macys.com: 5
PRESIDENTIAL HARASSMENT! : 5
Success is not final failure is not fatal: it is the courage to continue that counts. -- Winston Churchill : 5
: 4
Achievers move forward at all times. Achievement is not a plateau it's a beginning. : 4
(Other) :38712
created_at retweet_count favorite_count is_retweet id_str
: 1682 Min. : 0 0 : 2607 : 1740 Min. :1.698e+09
5/1/2019 10:06 : 6 1st Qu.: 22 : 1682 1.01013E+17: 1 1st Qu.:3.581e+17
5/1/2019 9:56 : 6 Median : 300 1 : 682 1.15846E+17: 1 Median :5.623e+17
7/15/2018 13:33: 6 Mean : 5621 2 : 404 9.84823E+16: 1 Mean :5.958e+17
1/5/2015 3:26 : 5 3rd Qu.: 7716 15 : 309 FALSE :35353 3rd Qu.:7.853e+17
11/20/2015 1:06: 5 Max. :369530 12 : 305 TRUE : 1666 Max. :1.140e+18
(Other) :37052 NA's :1682 (Other):32773 NA's :1685
## CREATE SUBSETS OF THE STOCK DATA FOR DIFFERENT ANALYISS
overnight_ret_1_min <- subset(stockdata, overnight_1 == 1) ## select the subject of returns that are from close of business to opening of next business day
ret_1_min <- subset(stockdata, overnight_1 == 0) ## select the subset of 1 minute returns that are intraday
ret_2_min <- subset(stockdata, overnight_2 == 0) ## select the subset of 2 minute returns that are intraday
ret_5_min <- subset(stockdata, overnight_5 == 0) ## select the subset of 5 minute returns that are intraday
ret_10_min <- subset(stockdata, overnight_10 == 0) ## select the subset of 10 minute returns that are intraday
ret_20_min <- subset(stockdata, overnight_20 == 0) ## select the subset of 20 minute returns that are intraday
ret_30_min <- subset(stockdata, overnight_30 == 0) ## select the subset of 30 minute returns that are intraday
ret_60_min <- subset(stockdata, overnight_60 == 0) ## select the subset of 60 minute returns that are intraday
ret_120_min <- subset(stockdata, overnight_120 == 0) ## select the subset of 120 minute returns that are intraday
ret_240_min <- subset(stockdata, overnight_240 == 0) ## select the subset of 240 minute returns that are intraday
ret_360_min <- subset(stockdata, overnight_360 == 0) ## select the subset of 360 minute returns that are intraday
## Statistics about 1, 2, 5, 10, 20, 30, 60, 120, 240, and 360-minute returns
max1 <- max(ret_1_min$ret_1_min) #max return
min1 <- min(ret_1_min$ret_1_min) #min return
mean1 <- mean(ret_1_min$ret_1_min) #mean
sd1 <- sd(ret_1_min$ret_1_min) #standard deviation
max2 <- max(ret_2_min$ret_2_min) #max return
min2 <- min(ret_2_min$ret_2_min) #min return
mean2 <- mean(ret_2_min$ret_2_min) #mean
sd2 <- sd(ret_2_min$ret_2_min) #standard deviation
max5 <- max(ret_5_min$ret_5_min) #max return
min5 <- min(ret_5_min$ret_5_min) #min return
mean5 <- mean(ret_5_min$ret_5_min) #mean
sd5 <- sd(ret_5_min$ret_5_min) #standard deviation
max10 <- max(ret_10_min$ret_10_min) #max return
min10 <- min(ret_10_min$ret_10_min) #min return
mean10 <- mean(ret_10_min$ret_10_min) #mean
sd10 <- sd(ret_10_min$ret_10_min) #standard deviation
max20 <- max(ret_20_min$ret_20_min) #max return
min20 <- min(ret_20_min$ret_20_min) #min return
mean20 <- mean(ret_20_min$ret_20_min) #mean
sd20 <- sd(ret_20_min$ret_20_min) #standard deviation
max30 <- max(ret_30_min$ret_30_min) #max return
min30 <- min(ret_30_min$ret_30_min) #min return
mean30 <- mean(ret_30_min$ret_30_min) #mean
sd30 <- sd(ret_30_min$ret_30_min) #standard deviation
max60 <- max(ret_60_min$ret_60_min) #max return
min60 <- min(ret_60_min$ret_60_min) #min return
mean60 <- mean(ret_60_min$ret_60_min) #mean
sd60 <- sd(ret_60_min$ret_60_min) #standard deviation
max120 <- max(ret_120_min$ret_120_min) #max return
min120 <- min(ret_120_min$ret_120_min) #min return
mean120 <- mean(ret_120_min$ret_120_min) #mean
sd120 <- sd(ret_120_min$ret_120_min) #standard deviation
max240 <- max(ret_240_min$ret_240_min) #max return
min240 <- min(ret_240_min$ret_240_min) #min return
mean240 <- mean(ret_240_min$ret_240_min) #mean
sd240 <- sd(ret_240_min$ret_240_min) #standard deviation
max360 <- max(ret_360_min$ret_360_min) #max return
min360 <- min(ret_360_min$ret_360_min) #min return
mean360 <- mean(ret_360_min$ret_360_min) #mean
sd360 <- sd(ret_360_min$ret_360_min) #standard deviation
maxon <- max(overnight_ret_1_min$ret_1_min, na.rm=TRUE) #max return (excludes NA values)
minon <- min(overnight_ret_1_min$ret_1_min, na.rm=TRUE) #min return (excludes NA values)
meanon <- mean(overnight_ret_1_min$ret_1_min, na.rm=TRUE) #mean (excludes NA values)
sdon <- sd(overnight_ret_1_min$ret_1_min, na.rm=TRUE) #standard deviation (excludes NA values)
## Create Summary Table
sumtable <- matrix(c(max1, min1, mean1, sd1, max2, min2, mean2, sd2, max5, min5, mean5, sd5, max10, min10, mean10, sd10, max20, min20, mean20, sd20, max30, min30, mean30, sd30, max60, min60, mean60, sd60, max120, min120, mean120, sd120, max240, min240, mean240, sd240, max360, min360, mean360, sd30, maxon, minon, meanon, sdon), ncol = 4, byrow = TRUE)
colnames(sumtable) <- c("Max", "Min", "Mean", "Std. Dev")
rownames(sumtable) <- c("1 Minute", "2 Minutes", "5 Minutes", "10 Minutes", "20 Minutes", "30 Minutes", "60 Minutes", "120 Minutes", "240 Minutes", "360 Minutes", "Overnight")
sumtable <- as.table(sumtable)
sumtable
## Statistics about 1, 2, 5, 10, 20, 30, 60, 120, 240, and 360-minute returns
max1 <- max(ret_1_min$ret_1_min) #max return
min1 <- min(ret_1_min$ret_1_min) #min return
mean1 <- mean(ret_1_min$ret_1_min) #mean
sd1 <- sd(ret_1_min$ret_1_min) #standard deviation
max2 <- max(ret_2_min$ret_2_min) #max return
min2 <- min(ret_2_min$ret_2_min) #min return
mean2 <- mean(ret_2_min$ret_2_min) #mean
sd2 <- sd(ret_2_min$ret_2_min) #standard deviation
max5 <- max(ret_5_min$ret_5_min) #max return
min5 <- min(ret_5_min$ret_5_min) #min return
mean5 <- mean(ret_5_min$ret_5_min) #mean
sd5 <- sd(ret_5_min$ret_5_min) #standard deviation
max10 <- max(ret_10_min$ret_10_min) #max return
min10 <- min(ret_10_min$ret_10_min) #min return
mean10 <- mean(ret_10_min$ret_10_min) #mean
sd10 <- sd(ret_10_min$ret_10_min) #standard deviation
max20 <- max(ret_20_min$ret_20_min) #max return
min20 <- min(ret_20_min$ret_20_min) #min return
mean20 <- mean(ret_20_min$ret_20_min) #mean
sd20 <- sd(ret_20_min$ret_20_min) #standard deviation
max30 <- max(ret_30_min$ret_30_min) #max return
min30 <- min(ret_30_min$ret_30_min) #min return
mean30 <- mean(ret_30_min$ret_30_min) #mean
sd30 <- sd(ret_30_min$ret_30_min) #standard deviation
max60 <- max(ret_60_min$ret_60_min) #max return
min60 <- min(ret_60_min$ret_60_min) #min return
mean60 <- mean(ret_60_min$ret_60_min) #mean
sd60 <- sd(ret_60_min$ret_60_min) #standard deviation
max120 <- max(ret_120_min$ret_120_min) #max return
min120 <- min(ret_120_min$ret_120_min) #min return
mean120 <- mean(ret_120_min$ret_120_min) #mean
sd120 <- sd(ret_120_min$ret_120_min) #standard deviation
max240 <- max(ret_240_min$ret_240_min) #max return
min240 <- min(ret_240_min$ret_240_min) #min return
mean240 <- mean(ret_240_min$ret_240_min) #mean
sd240 <- sd(ret_240_min$ret_240_min) #standard deviation
max360 <- max(ret_360_min$ret_360_min) #max return
min360 <- min(ret_360_min$ret_360_min) #min return
mean360 <- mean(ret_360_min$ret_360_min) #mean
sd360 <- sd(ret_360_min$ret_360_min) #standard deviation
maxon <- max(overnight_ret_1_min$ret_1_min, na.rm=TRUE) #max return (excludes NA values)
minon <- min(overnight_ret_1_min$ret_1_min, na.rm=TRUE) #min return (excludes NA values)
meanon <- mean(overnight_ret_1_min$ret_1_min, na.rm=TRUE) #mean (excludes NA values)
sdon <- sd(overnight_ret_1_min$ret_1_min, na.rm=TRUE) #standard deviation (excludes NA values)
## Create Summary Table
sumtable <- matrix(c(max1, min1, mean1, sd1, max2, min2, mean2, sd2, max5, min5, mean5, sd5, max10, min10, mean10, sd10, max20, min20, mean20, sd20, max30, min30, mean30, sd30, max60, min60, mean60, sd60, max120, min120, mean120, sd120, max240, min240, mean240, sd240, max360, min360, mean360, sd30, maxon, minon, meanon, sdon), ncol = 4, byrow = TRUE)
colnames(sumtable) <- c("Max", "Min", "Mean", "Std. Dev")
rownames(sumtable) <- c("1 Minute", "2 Minutes", "5 Minutes", "10 Minutes", "20 Minutes", "30 Minutes", "60 Minutes", "120 Minutes", "240 Minutes", "360 Minutes", "Overnight")
sumtable <- as.table(sumtable)
sumtable
Max Min Mean Std. Dev
1 Minute 8.887780e-03 -8.002421e-03 -3.766096e-07 3.050208e-04
2 Minutes 9.158534e-03 -8.227404e-03 -9.490072e-07 4.347683e-04
5 Minutes 1.516062e-02 -1.363070e-02 -2.457308e-06 6.873840e-04
10 Minutes 2.009808e-02 -1.607326e-02 -4.835723e-06 9.660964e-04
20 Minutes 2.637849e-02 -2.055613e-02 -8.298702e-06 1.356654e-03
30 Minutes 3.001411e-02 -2.723621e-02 -8.887262e-06 1.646093e-03
60 Minutes 2.620649e-02 -2.900513e-02 -1.492825e-05 2.292182e-03
120 Minutes 3.339548e-02 -3.113897e-02 -2.113783e-05 3.195499e-03
240 Minutes 3.312860e-02 -4.056254e-02 -2.838216e-05 4.608615e-03
360 Minutes 4.342457e-02 -3.497171e-02 -7.897111e-05 1.646093e-03
Overnight 1.586192e-02 -2.077167e-02 4.550390e-04 3.982014e-03
## HISTOGRAM OF MINUTE BY MINUTE STOCK RETURNS
hist(ret_1_min$ret_1_min,
breaks = 500,
main = "1 Minute Intraday Returns",
xlab = "Minute Level Returns",
col = "Light Blue")

## HISTOGRAM OF OVERNIGHT STOCK RETURNS
hist(overnight_ret_1_min$ret_1_min,
breaks = 100,
main = "Overnight Returns",
xlab = "End of Trading Day to Beginning of Next Trading Day Returns",
col = "Red")

## CREATE DENSITY PLOT DISTRIBUTIONS
d1 <- density(ret_1_min$ret_1_min, from = -0.05, to = 0.05)
d2 <- density(ret_2_min$ret_2_min, from = -0.05, to = 0.05)
d5 <- density(ret_5_min$ret_5_min, from = -0.05, to = 0.05)
d10 <- density(ret_10_min$ret_10_min, from = -0.05, to = 0.05)
d20 <- density(ret_20_min$ret_20_min, from = -0.05, to = 0.05)
d30 <- density(ret_30_min$ret_30_min, from = -0.05, to = 0.05)
d60 <- density(ret_60_min$ret_60_min, from = -0.05, to = 0.05)
d120 <- density(ret_120_min$ret_120_min, from = -0.05, to = 0.05)
d240 <- density(ret_240_min$ret_240_min, from = -0.05, to = 0.05)
d360 <- density(ret_360_min$ret_360_min, from = -0.05, to = 0.05)
don <- density(overnight_ret_1_min$ret_1_min, na.rm = TRUE, from = -0.05, to = 0.05) #EXCLUDE NA VALUES FROM ANALYSIS (ERROR RESULTS IF YOU DON'T DO THIS)
## PLOT DENSITY PLOTS
plot(d1, main = "Denstiy Plot: 1 Minute Returns", xlab = "Distribution of 1 Minute Returns")
polygon(d1, col = "Light Blue", border = "Blue")

plot(d2, main = "Denstiy Plot: 2 Minute Returns", xlab = "Distribution of 2 Minute Returns")
polygon(d2, col = "Light Blue", border = "Blue")

plot(d5, main = "Denstiy Plot: 5 Minute Returns", xlab = "Distribution of 5 Minute Returns")
polygon(d5, col = "Light Blue", border = "Blue")

plot(d10, main = "Denstiy Plot: 10 Minute Returns", xlab = "Distribution of 10 Minute Returns")
polygon(d10, col = "Light Blue", border = "Blue")

plot(d20, main = "Denstiy Plot: 20 Minute Returns", xlab = "Distribution of 20 Minute Returns")
polygon(d20, col = "Light Blue", border = "Blue")

plot(d30, main = "Denstiy Plot: 30 Minute Returns", xlab = "Distribution of 30 Minute Returns")
polygon(d30, col = "Light Blue", border = "Blue")

plot(d60, main = "Denstiy Plot: 60 Minute Returns", xlab = "Distribution of 60 Minute Returns")
polygon(d60, col = "Light Blue", border = "Blue")

plot(d120, main = "Denstiy Plot: 120 Minute Returns", xlab = "Distribution of 120 Minute Returns")
polygon(d120, col = "Light Blue", border = "Blue")

plot(d240, main = "Denstiy Plot: 240 Minute Returns", xlab = "Distribution of 240 Minute Returns")
polygon(d240, col = "Light Blue", border = "Blue")

plot(d360, main = "Denstiy Plot: 360 Minute Returns", xlab = "Distribution of 360 Minute Returns")
polygon(d360, col = "Light Blue", border = "Blue")

plot(don, main = "Denstiy Plot: Overnight Returns", xlab = "Distribution of Overnight Returns")
polygon(don, col = "Light Green", border = "Green")



LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpUaGlzIGlzIGFuIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBOb3RlYm9vay4gV2hlbiB5b3UgZXhlY3V0ZSBjb2RlIHdpdGhpbiB0aGUgbm90ZWJvb2ssIHRoZSByZXN1bHRzIGFwcGVhciBiZW5lYXRoIHRoZSBjb2RlLiANCg0KVHJ5IGV4ZWN1dGluZyB0aGlzIGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqUnVuKiBidXR0b24gd2l0aGluIHRoZSBjaHVuayBvciBieSBwbGFjaW5nIHlvdXIgY3Vyc29yIGluc2lkZSBpdCBhbmQgcHJlc3NpbmcgKkN0cmwrU2hpZnQrRW50ZXIqLiANCg0KQWRkIGEgbmV3IGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqSW5zZXJ0IENodW5rKiBidXR0b24gb24gdGhlIHRvb2xiYXIgb3IgYnkgcHJlc3NpbmcgKkN0cmwrQWx0K0kqLg0KDQpXaGVuIHlvdSBzYXZlIHRoZSBub3RlYm9vaywgYW4gSFRNTCBmaWxlIGNvbnRhaW5pbmcgdGhlIGNvZGUgYW5kIG91dHB1dCB3aWxsIGJlIHNhdmVkIGFsb25nc2lkZSBpdCAoY2xpY2sgdGhlICpQcmV2aWV3KiBidXR0b24gb3IgcHJlc3MgKkN0cmwrU2hpZnQrSyogdG8gcHJldmlldyB0aGUgSFRNTCBmaWxlKS4NCg0KYGBge3IgTElCUkFSSUVTIEFORCBQQUNLQUdFU30NCiMjICBJTlNUQUxMIFJFUVVJUkVEIFBBQ0tBR0VTIEFORCBMSUJSQVJJRVMNCmluc3RhbGwucGFja2FnZXMoInNtIikNCmluc3RhbGwucGFja2FnZXMoImdncGxvdDIiKQ0KaW5zdGFsbC5wYWNrYWdlcygic3FsZGYiKQ0KDQoNCiMjICBJTlNUQUxMIExJQlJBUklFUw0KbGlicmFyeShzbSkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoc3FsZGYpDQpgYGANCg0KDQpgYGB7ciBTRVQgV09SS0lORyBESVJFQ1RPUll9DQpnZXR3ZCgpDQojc2V0d2QoIkM6L1VzZXJzL2hhcnNoaWwuYi5zaGFoL0RvY3VtZW50cy9HaXRIdWIvRkU4MDBIQlMiKQ0KI3NldHdkKCJDOi9Vc2Vycy9iaW50YS5kLnBhdGVsL0RvY3VtZW50cy9HaXRIdWIvRkU4MDBIQlMvRkU4MDBIQlMiKQ0Kc2V0d2QoIkM6L1VzZXJzL3JpY2hhL09uZURyaXZlL0RvY3VtZW50cy9FZHVjYXRpb24vU3RldmVucyBJbnN0aXR1dGUvRkUgODAwL1Byb2plY3QvRkU4MDBIQlMiKQ0KDQojIyByZWFkIERvbmFsZCBUcnVtcCB0d2VldHMgZG93bmxvYWRlZCBmcm9tIHRydW1wdHdpdHRlcmFyY2hpdmUuY29tIA0KcmVhbERUIDwtIHJlYWQuY3N2KCJEb25hbGRUcnVtcFR3ZWV0cy5jc3YiLGhlYWRlciA9IFRSVUUpDQoNCmBgYA0KDQpgYGB7cn0NCiMjIHNlZSBmaXJzdCA2IHJvd3Mgb2YgdGhlIGRhdGFzZXQNCmhlYWQocmVhbERUKQ0KDQojIyB0YWlsKHJlYWxEVCkNCmBgYA0KDQpgYGB7cn0NCiMjIGNoZWNrIG51bWJlciBvZiByb3dzIGFuZCBjb2x1bW5zDQpucm93KHJlYWxEVCkNCm5jb2wocmVhbERUKQ0KYGBgDQoNCmBgYHtyfQ0KIyMgY2hlY2sgZGF0ZSByYW5nZSBvZiB0d2VldHMNCnN1bW1hcnkocmVhbERUKQ0KYGBgDQoNCmBgYHtyIExPQUQgU1RPQ0sgREFUQX0NCiMjICBSZWFkIFN0b2NrIERhdGENCnN0b2NrZGF0YSA8LSByZWFkLmNzdigic3RvY2tkYXRhLmNzdiIsIGhlYWRlciA9IFRSVUUsIHNlcCA9ICIsIikNCiMjICBTdW1tYXJpemUgU3RvY2sgRGF0YQ0KaGVhZChzdG9ja2RhdGEpDQojIyAgTnVtYmVyIG9mIFJvd3MgaW4gc3RvY2sgbWFya2V0IGRhdGENCm5yb3coc3RvY2tkYXRhKQ0KDQpgYGANCg0KYGBge3IgU1VCU0VUIFNUT0NLIERBVEEgfQ0KIyMgQ1JFQVRFIFNVQlNFVFMgT0YgVEhFIFNUT0NLIERBVEEgRk9SIERJRkZFUkVOVCBBTkFMWUlTUw0KDQpvdmVybmlnaHRfcmV0XzFfbWluIDwtIHN1YnNldChzdG9ja2RhdGEsIG92ZXJuaWdodF8xID09IDEpICMjIHNlbGVjdCB0aGUgc3ViamVjdCBvZiByZXR1cm5zIHRoYXQgYXJlIGZyb20gY2xvc2Ugb2YgYnVzaW5lc3MgdG8gb3BlbmluZyBvZiBuZXh0IGJ1c2luZXNzIGRheQ0KcmV0XzFfbWluIDwtIHN1YnNldChzdG9ja2RhdGEsIG92ZXJuaWdodF8xID09IDApICMjIHNlbGVjdCB0aGUgc3Vic2V0IG9mIDEgbWludXRlIHJldHVybnMgdGhhdCBhcmUgaW50cmFkYXkNCnJldF8yX21pbiA8LSBzdWJzZXQoc3RvY2tkYXRhLCBvdmVybmlnaHRfMiA9PSAwKSAjIyBzZWxlY3QgdGhlIHN1YnNldCBvZiAyIG1pbnV0ZSByZXR1cm5zIHRoYXQgYXJlIGludHJhZGF5DQpyZXRfNV9taW4gPC0gc3Vic2V0KHN0b2NrZGF0YSwgb3Zlcm5pZ2h0XzUgPT0gMCkgIyMgc2VsZWN0IHRoZSBzdWJzZXQgb2YgNSBtaW51dGUgcmV0dXJucyB0aGF0IGFyZSBpbnRyYWRheQ0KcmV0XzEwX21pbiA8LSBzdWJzZXQoc3RvY2tkYXRhLCBvdmVybmlnaHRfMTAgPT0gMCkgIyMgc2VsZWN0IHRoZSBzdWJzZXQgb2YgMTAgbWludXRlIHJldHVybnMgdGhhdCBhcmUgaW50cmFkYXkNCnJldF8yMF9taW4gPC0gc3Vic2V0KHN0b2NrZGF0YSwgb3Zlcm5pZ2h0XzIwID09IDApICMjIHNlbGVjdCB0aGUgc3Vic2V0IG9mIDIwIG1pbnV0ZSByZXR1cm5zIHRoYXQgYXJlIGludHJhZGF5DQpyZXRfMzBfbWluIDwtIHN1YnNldChzdG9ja2RhdGEsIG92ZXJuaWdodF8zMCA9PSAwKSAjIyBzZWxlY3QgdGhlIHN1YnNldCBvZiAzMCBtaW51dGUgcmV0dXJucyB0aGF0IGFyZSBpbnRyYWRheQ0KcmV0XzYwX21pbiA8LSBzdWJzZXQoc3RvY2tkYXRhLCBvdmVybmlnaHRfNjAgPT0gMCkgIyMgc2VsZWN0IHRoZSBzdWJzZXQgb2YgNjAgbWludXRlIHJldHVybnMgdGhhdCBhcmUgaW50cmFkYXkNCnJldF8xMjBfbWluIDwtIHN1YnNldChzdG9ja2RhdGEsIG92ZXJuaWdodF8xMjAgPT0gMCkgIyMgc2VsZWN0IHRoZSBzdWJzZXQgb2YgMTIwIG1pbnV0ZSByZXR1cm5zIHRoYXQgYXJlIGludHJhZGF5DQpyZXRfMjQwX21pbiA8LSBzdWJzZXQoc3RvY2tkYXRhLCBvdmVybmlnaHRfMjQwID09IDApICMjIHNlbGVjdCB0aGUgc3Vic2V0IG9mIDI0MCBtaW51dGUgcmV0dXJucyB0aGF0IGFyZSBpbnRyYWRheQ0KcmV0XzM2MF9taW4gPC0gc3Vic2V0KHN0b2NrZGF0YSwgb3Zlcm5pZ2h0XzM2MCA9PSAwKSAjIyBzZWxlY3QgdGhlIHN1YnNldCBvZiAzNjAgbWludXRlIHJldHVybnMgdGhhdCBhcmUgaW50cmFkYXkNCg0KYGBgDQoNCmBgYHtyIFNUQVRJU1RJQ1N9DQojIyAgU3RhdGlzdGljcyBhYm91dCAxLCAyLCA1LCAxMCwgMjAsIDMwLCA2MCwgMTIwLCAyNDAsIGFuZCAzNjAtbWludXRlIHJldHVybnMNCm1heDEgPC0gbWF4KHJldF8xX21pbiRyZXRfMV9taW4pICNtYXggcmV0dXJuDQptaW4xIDwtIG1pbihyZXRfMV9taW4kcmV0XzFfbWluKSAjbWluIHJldHVybg0KbWVhbjEgPC0gbWVhbihyZXRfMV9taW4kcmV0XzFfbWluKSAjbWVhbg0Kc2QxIDwtIHNkKHJldF8xX21pbiRyZXRfMV9taW4pICNzdGFuZGFyZCBkZXZpYXRpb24NCg0KbWF4MiA8LSBtYXgocmV0XzJfbWluJHJldF8yX21pbikgI21heCByZXR1cm4NCm1pbjIgPC0gbWluKHJldF8yX21pbiRyZXRfMl9taW4pICNtaW4gcmV0dXJuDQptZWFuMiA8LSBtZWFuKHJldF8yX21pbiRyZXRfMl9taW4pICNtZWFuDQpzZDIgPC0gc2QocmV0XzJfbWluJHJldF8yX21pbikgI3N0YW5kYXJkIGRldmlhdGlvbg0KDQptYXg1IDwtIG1heChyZXRfNV9taW4kcmV0XzVfbWluKSAjbWF4IHJldHVybg0KbWluNSA8LSBtaW4ocmV0XzVfbWluJHJldF81X21pbikgI21pbiByZXR1cm4NCm1lYW41IDwtIG1lYW4ocmV0XzVfbWluJHJldF81X21pbikgI21lYW4NCnNkNSA8LSBzZChyZXRfNV9taW4kcmV0XzVfbWluKSAjc3RhbmRhcmQgZGV2aWF0aW9uDQoNCm1heDEwIDwtIG1heChyZXRfMTBfbWluJHJldF8xMF9taW4pICNtYXggcmV0dXJuDQptaW4xMCA8LSBtaW4ocmV0XzEwX21pbiRyZXRfMTBfbWluKSAjbWluIHJldHVybg0KbWVhbjEwIDwtIG1lYW4ocmV0XzEwX21pbiRyZXRfMTBfbWluKSAjbWVhbg0Kc2QxMCA8LSBzZChyZXRfMTBfbWluJHJldF8xMF9taW4pICNzdGFuZGFyZCBkZXZpYXRpb24NCg0KbWF4MjAgPC0gbWF4KHJldF8yMF9taW4kcmV0XzIwX21pbikgI21heCByZXR1cm4NCm1pbjIwIDwtIG1pbihyZXRfMjBfbWluJHJldF8yMF9taW4pICNtaW4gcmV0dXJuDQptZWFuMjAgPC0gbWVhbihyZXRfMjBfbWluJHJldF8yMF9taW4pICNtZWFuDQpzZDIwIDwtIHNkKHJldF8yMF9taW4kcmV0XzIwX21pbikgI3N0YW5kYXJkIGRldmlhdGlvbg0KDQptYXgzMCA8LSBtYXgocmV0XzMwX21pbiRyZXRfMzBfbWluKSAjbWF4IHJldHVybg0KbWluMzAgPC0gbWluKHJldF8zMF9taW4kcmV0XzMwX21pbikgI21pbiByZXR1cm4NCm1lYW4zMCA8LSBtZWFuKHJldF8zMF9taW4kcmV0XzMwX21pbikgI21lYW4NCnNkMzAgPC0gc2QocmV0XzMwX21pbiRyZXRfMzBfbWluKSAjc3RhbmRhcmQgZGV2aWF0aW9uDQoNCm1heDYwIDwtIG1heChyZXRfNjBfbWluJHJldF82MF9taW4pICNtYXggcmV0dXJuDQptaW42MCA8LSBtaW4ocmV0XzYwX21pbiRyZXRfNjBfbWluKSAjbWluIHJldHVybg0KbWVhbjYwIDwtIG1lYW4ocmV0XzYwX21pbiRyZXRfNjBfbWluKSAjbWVhbg0Kc2Q2MCA8LSBzZChyZXRfNjBfbWluJHJldF82MF9taW4pICNzdGFuZGFyZCBkZXZpYXRpb24NCg0KbWF4MTIwIDwtIG1heChyZXRfMTIwX21pbiRyZXRfMTIwX21pbikgI21heCByZXR1cm4NCm1pbjEyMCA8LSBtaW4ocmV0XzEyMF9taW4kcmV0XzEyMF9taW4pICNtaW4gcmV0dXJuDQptZWFuMTIwIDwtIG1lYW4ocmV0XzEyMF9taW4kcmV0XzEyMF9taW4pICNtZWFuDQpzZDEyMCA8LSBzZChyZXRfMTIwX21pbiRyZXRfMTIwX21pbikgI3N0YW5kYXJkIGRldmlhdGlvbg0KDQptYXgyNDAgPC0gbWF4KHJldF8yNDBfbWluJHJldF8yNDBfbWluKSAjbWF4IHJldHVybg0KbWluMjQwIDwtIG1pbihyZXRfMjQwX21pbiRyZXRfMjQwX21pbikgI21pbiByZXR1cm4NCm1lYW4yNDAgPC0gbWVhbihyZXRfMjQwX21pbiRyZXRfMjQwX21pbikgI21lYW4NCnNkMjQwIDwtIHNkKHJldF8yNDBfbWluJHJldF8yNDBfbWluKSAjc3RhbmRhcmQgZGV2aWF0aW9uDQoNCm1heDM2MCA8LSBtYXgocmV0XzM2MF9taW4kcmV0XzM2MF9taW4pICNtYXggcmV0dXJuDQptaW4zNjAgPC0gbWluKHJldF8zNjBfbWluJHJldF8zNjBfbWluKSAjbWluIHJldHVybg0KbWVhbjM2MCA8LSBtZWFuKHJldF8zNjBfbWluJHJldF8zNjBfbWluKSAjbWVhbg0Kc2QzNjAgPC0gc2QocmV0XzM2MF9taW4kcmV0XzM2MF9taW4pICNzdGFuZGFyZCBkZXZpYXRpb24NCg0KbWF4b24gPC0gbWF4KG92ZXJuaWdodF9yZXRfMV9taW4kcmV0XzFfbWluLCBuYS5ybT1UUlVFKSAjbWF4IHJldHVybiAoZXhjbHVkZXMgTkEgdmFsdWVzKQ0KbWlub24gPC0gbWluKG92ZXJuaWdodF9yZXRfMV9taW4kcmV0XzFfbWluLCBuYS5ybT1UUlVFKSAjbWluIHJldHVybiAoZXhjbHVkZXMgTkEgdmFsdWVzKQ0KbWVhbm9uIDwtIG1lYW4ob3Zlcm5pZ2h0X3JldF8xX21pbiRyZXRfMV9taW4sIG5hLnJtPVRSVUUpICNtZWFuIChleGNsdWRlcyBOQSB2YWx1ZXMpDQpzZG9uIDwtIHNkKG92ZXJuaWdodF9yZXRfMV9taW4kcmV0XzFfbWluLCBuYS5ybT1UUlVFKSAjc3RhbmRhcmQgZGV2aWF0aW9uIChleGNsdWRlcyBOQSB2YWx1ZXMpDQoNCg0KYGBgDQoNCmBgYHtyIFNVTU1BUlkgVEFCTEUgV0lUSCBTVEFUSVNUSUNTIFJFU1VMVFN9DQojIyAgQ3JlYXRlIFN1bW1hcnkgVGFibGUNCg0Kc3VtdGFibGUgPC0gbWF0cml4KGMobWF4MSwgbWluMSwgbWVhbjEsIHNkMSwgbWF4MiwgbWluMiwgbWVhbjIsIHNkMiwgbWF4NSwgbWluNSwgbWVhbjUsIHNkNSwgbWF4MTAsIG1pbjEwLCBtZWFuMTAsIHNkMTAsIG1heDIwLCBtaW4yMCwgbWVhbjIwLCBzZDIwLCBtYXgzMCwgbWluMzAsIG1lYW4zMCwgc2QzMCwgbWF4NjAsIG1pbjYwLCBtZWFuNjAsIHNkNjAsIG1heDEyMCwgbWluMTIwLCBtZWFuMTIwLCBzZDEyMCwgbWF4MjQwLCBtaW4yNDAsIG1lYW4yNDAsIHNkMjQwLCBtYXgzNjAsIG1pbjM2MCwgbWVhbjM2MCwgc2QzMCwgbWF4b24sIG1pbm9uLCBtZWFub24sIHNkb24pLCBuY29sID0gNCwgYnlyb3cgPSBUUlVFKQ0KY29sbmFtZXMoc3VtdGFibGUpIDwtIGMoIk1heCIsICJNaW4iLCAiTWVhbiIsICJTdGQuIERldiIpDQpyb3duYW1lcyhzdW10YWJsZSkgPC0gYygiMSBNaW51dGUiLCAiMiBNaW51dGVzIiwgIjUgTWludXRlcyIsICIxMCBNaW51dGVzIiwgIjIwIE1pbnV0ZXMiLCAiMzAgTWludXRlcyIsICI2MCBNaW51dGVzIiwgIjEyMCBNaW51dGVzIiwgIjI0MCBNaW51dGVzIiwgIjM2MCBNaW51dGVzIiwgIk92ZXJuaWdodCIpDQpzdW10YWJsZSA8LSBhcy50YWJsZShzdW10YWJsZSkNCnN1bXRhYmxlDQpgYGANCg0KDQoNCg0KYGBge3IgRFQgVFdFRVQgU1RPQ0tEQVRBfQ0KIyMgQ1JFQVRFIFNVQlNFVFMgT0YgVEhFIFNUT0NLIERBVEEgVEhBVCBSRVBSRVNFTlRTIFRIRSBUSU1FIEZSQU1FUyBBRlRFUiBET05BTEQgVFJVTVAgVFdFRVRTDQoNCmR0X292ZXJuaWdodF9yZXRfMV9taW4gPC0gc3Vic2V0KERUc3RvY2tkYXRhLCBkdHR3ZWV0ZmxhZyA9PSAxLCBvdmVybmlnaHRfMSA9PSAxKSAjIyBzZWxlY3QgdGhlIHN1YnNldCBvZiByZXR1cm5zIHRoYXQgYXJlIGZyb20gY2xvc2Ugb2YgYnVzaW5lc3MgdG8gb3BlbmluZyBvZiBuZXh0IGJ1c2luZXNzIGRheQ0KZHRfcmV0XzFfbWluIDwtIHN1YnNldChzdG9ja2RhdGEsIGR0dHdlZXRmbGFnID09IDEsIG92ZXJuaWdodF8xID09IDApICMjIHNlbGVjdCB0aGUgc3Vic2V0IG9mIDEgbWludXRlIHJldHVybnMgdGhhdCBhcmUgaW50cmFkYXkNCmR0X3JldF8yX21pbiA8LSBzdWJzZXQoc3RvY2tkYXRhLCBkdHR3ZWV0ZmxhZyA9PSAxLCBvdmVybmlnaHRfMiA9PSAwKSAjIyBzZWxlY3QgdGhlIHN1YnNldCBvZiAyIG1pbnV0ZSByZXR1cm5zIHRoYXQgYXJlIGludHJhZGF5DQpkdF9yZXRfNV9taW4gPC0gc3Vic2V0KHN0b2NrZGF0YSwgZHR0d2VldGZsYWcgPT0gMSwgb3Zlcm5pZ2h0XzUgPT0gMCkgIyMgc2VsZWN0IHRoZSBzdWJzZXQgb2YgNSBtaW51dGUgcmV0dXJucyB0aGF0IGFyZSBpbnRyYWRheQ0KZHRfcmV0XzEwX21pbiA8LSBzdWJzZXQoc3RvY2tkYXRhLCBkdHR3ZWV0ZmxhZyA9PSAxLCBvdmVybmlnaHRfMTAgPT0gMCkgIyMgc2VsZWN0IHRoZSBzdWJzZXQgb2YgMTAgbWludXRlIHJldHVybnMgdGhhdCBhcmUgaW50cmFkYXkNCmR0X3JldF8yMF9taW4gPC0gc3Vic2V0KHN0b2NrZGF0YSwgZHR0d2VldGZsYWcgPT0gMSwgb3Zlcm5pZ2h0XzIwID09IDApICMjIHNlbGVjdCB0aGUgc3Vic2V0IG9mIDIwIG1pbnV0ZSByZXR1cm5zIHRoYXQgYXJlIGludHJhZGF5DQpkdF9yZXRfMzBfbWluIDwtIHN1YnNldChzdG9ja2RhdGEsIGR0dHdlZXRmbGFnID09IDEsIG92ZXJuaWdodF8zMCA9PSAwKSAjIyBzZWxlY3QgdGhlIHN1YnNldCBvZiAzMCBtaW51dGUgcmV0dXJucyB0aGF0IGFyZSBpbnRyYWRheQ0KZHRfcmV0XzYwX21pbiA8LSBzdWJzZXQoc3RvY2tkYXRhLCBkdHR3ZWV0ZmxhZyA9PSAxLCBvdmVybmlnaHRfNjAgPT0gMCkgIyMgc2VsZWN0IHRoZSBzdWJzZXQgb2YgNjAgbWludXRlIHJldHVybnMgdGhhdCBhcmUgaW50cmFkYXkNCmR0X3JldF8xMjBfbWluIDwtIHN1YnNldChzdG9ja2RhdGEsIGR0dHdlZXRmbGFnID09IDEsIG92ZXJuaWdodF8xMjAgPT0gMCkgIyMgc2VsZWN0IHRoZSBzdWJzZXQgb2YgMTIwIG1pbnV0ZSByZXR1cm5zIHRoYXQgYXJlIGludHJhZGF5DQpkdF9yZXRfMjQwX21pbiA8LSBzdWJzZXQoc3RvY2tkYXRhLCBkdHR3ZWV0ZmxhZyA9PSAxLCBvdmVybmlnaHRfMjQwID09IDApICMjIHNlbGVjdCB0aGUgc3Vic2V0IG9mIDI0MCBtaW51dGUgcmV0dXJucyB0aGF0IGFyZSBpbnRyYWRheQ0KZHRfcmV0XzM2MF9taW4gPC0gc3Vic2V0KHN0b2NrZGF0YSwgZHR0d2VldGZsYWcgPT0gMSwgb3Zlcm5pZ2h0XzM2MCA9PSAwKSAjIyBzZWxlY3QgdGhlIHN1YnNldCBvZiAzNjAgbWludXRlIHJldHVybnMgdGhhdCBhcmUgaW50cmFkYXkNCmBgYA0KDQpgYGB7ciBTVEFUSVNUSUNTIERUfQ0KIyMgIFN0YXRpc3RpY3MgYWJvdXQgMSwgMiwgNSwgMTAsIDIwLCAzMCwgNjAsIDEyMCwgMjQwLCBhbmQgMzYwLW1pbnV0ZSByZXR1cm5zDQptYXgxIDwtIG1heChyZXRfMV9taW4kcmV0XzFfbWluKSAjbWF4IHJldHVybg0KbWluMSA8LSBtaW4ocmV0XzFfbWluJHJldF8xX21pbikgI21pbiByZXR1cm4NCm1lYW4xIDwtIG1lYW4ocmV0XzFfbWluJHJldF8xX21pbikgI21lYW4NCnNkMSA8LSBzZChyZXRfMV9taW4kcmV0XzFfbWluKSAjc3RhbmRhcmQgZGV2aWF0aW9uDQoNCm1heDIgPC0gbWF4KHJldF8yX21pbiRyZXRfMl9taW4pICNtYXggcmV0dXJuDQptaW4yIDwtIG1pbihyZXRfMl9taW4kcmV0XzJfbWluKSAjbWluIHJldHVybg0KbWVhbjIgPC0gbWVhbihyZXRfMl9taW4kcmV0XzJfbWluKSAjbWVhbg0Kc2QyIDwtIHNkKHJldF8yX21pbiRyZXRfMl9taW4pICNzdGFuZGFyZCBkZXZpYXRpb24NCg0KbWF4NSA8LSBtYXgocmV0XzVfbWluJHJldF81X21pbikgI21heCByZXR1cm4NCm1pbjUgPC0gbWluKHJldF81X21pbiRyZXRfNV9taW4pICNtaW4gcmV0dXJuDQptZWFuNSA8LSBtZWFuKHJldF81X21pbiRyZXRfNV9taW4pICNtZWFuDQpzZDUgPC0gc2QocmV0XzVfbWluJHJldF81X21pbikgI3N0YW5kYXJkIGRldmlhdGlvbg0KDQptYXgxMCA8LSBtYXgocmV0XzEwX21pbiRyZXRfMTBfbWluKSAjbWF4IHJldHVybg0KbWluMTAgPC0gbWluKHJldF8xMF9taW4kcmV0XzEwX21pbikgI21pbiByZXR1cm4NCm1lYW4xMCA8LSBtZWFuKHJldF8xMF9taW4kcmV0XzEwX21pbikgI21lYW4NCnNkMTAgPC0gc2QocmV0XzEwX21pbiRyZXRfMTBfbWluKSAjc3RhbmRhcmQgZGV2aWF0aW9uDQoNCm1heDIwIDwtIG1heChyZXRfMjBfbWluJHJldF8yMF9taW4pICNtYXggcmV0dXJuDQptaW4yMCA8LSBtaW4ocmV0XzIwX21pbiRyZXRfMjBfbWluKSAjbWluIHJldHVybg0KbWVhbjIwIDwtIG1lYW4ocmV0XzIwX21pbiRyZXRfMjBfbWluKSAjbWVhbg0Kc2QyMCA8LSBzZChyZXRfMjBfbWluJHJldF8yMF9taW4pICNzdGFuZGFyZCBkZXZpYXRpb24NCg0KbWF4MzAgPC0gbWF4KHJldF8zMF9taW4kcmV0XzMwX21pbikgI21heCByZXR1cm4NCm1pbjMwIDwtIG1pbihyZXRfMzBfbWluJHJldF8zMF9taW4pICNtaW4gcmV0dXJuDQptZWFuMzAgPC0gbWVhbihyZXRfMzBfbWluJHJldF8zMF9taW4pICNtZWFuDQpzZDMwIDwtIHNkKHJldF8zMF9taW4kcmV0XzMwX21pbikgI3N0YW5kYXJkIGRldmlhdGlvbg0KDQptYXg2MCA8LSBtYXgocmV0XzYwX21pbiRyZXRfNjBfbWluKSAjbWF4IHJldHVybg0KbWluNjAgPC0gbWluKHJldF82MF9taW4kcmV0XzYwX21pbikgI21pbiByZXR1cm4NCm1lYW42MCA8LSBtZWFuKHJldF82MF9taW4kcmV0XzYwX21pbikgI21lYW4NCnNkNjAgPC0gc2QocmV0XzYwX21pbiRyZXRfNjBfbWluKSAjc3RhbmRhcmQgZGV2aWF0aW9uDQoNCm1heDEyMCA8LSBtYXgocmV0XzEyMF9taW4kcmV0XzEyMF9taW4pICNtYXggcmV0dXJuDQptaW4xMjAgPC0gbWluKHJldF8xMjBfbWluJHJldF8xMjBfbWluKSAjbWluIHJldHVybg0KbWVhbjEyMCA8LSBtZWFuKHJldF8xMjBfbWluJHJldF8xMjBfbWluKSAjbWVhbg0Kc2QxMjAgPC0gc2QocmV0XzEyMF9taW4kcmV0XzEyMF9taW4pICNzdGFuZGFyZCBkZXZpYXRpb24NCg0KbWF4MjQwIDwtIG1heChyZXRfMjQwX21pbiRyZXRfMjQwX21pbikgI21heCByZXR1cm4NCm1pbjI0MCA8LSBtaW4ocmV0XzI0MF9taW4kcmV0XzI0MF9taW4pICNtaW4gcmV0dXJuDQptZWFuMjQwIDwtIG1lYW4ocmV0XzI0MF9taW4kcmV0XzI0MF9taW4pICNtZWFuDQpzZDI0MCA8LSBzZChyZXRfMjQwX21pbiRyZXRfMjQwX21pbikgI3N0YW5kYXJkIGRldmlhdGlvbg0KDQptYXgzNjAgPC0gbWF4KHJldF8zNjBfbWluJHJldF8zNjBfbWluKSAjbWF4IHJldHVybg0KbWluMzYwIDwtIG1pbihyZXRfMzYwX21pbiRyZXRfMzYwX21pbikgI21pbiByZXR1cm4NCm1lYW4zNjAgPC0gbWVhbihyZXRfMzYwX21pbiRyZXRfMzYwX21pbikgI21lYW4NCnNkMzYwIDwtIHNkKHJldF8zNjBfbWluJHJldF8zNjBfbWluKSAjc3RhbmRhcmQgZGV2aWF0aW9uDQoNCm1heG9uIDwtIG1heChvdmVybmlnaHRfcmV0XzFfbWluJHJldF8xX21pbiwgbmEucm09VFJVRSkgI21heCByZXR1cm4gKGV4Y2x1ZGVzIE5BIHZhbHVlcykNCm1pbm9uIDwtIG1pbihvdmVybmlnaHRfcmV0XzFfbWluJHJldF8xX21pbiwgbmEucm09VFJVRSkgI21pbiByZXR1cm4gKGV4Y2x1ZGVzIE5BIHZhbHVlcykNCm1lYW5vbiA8LSBtZWFuKG92ZXJuaWdodF9yZXRfMV9taW4kcmV0XzFfbWluLCBuYS5ybT1UUlVFKSAjbWVhbiAoZXhjbHVkZXMgTkEgdmFsdWVzKQ0Kc2RvbiA8LSBzZChvdmVybmlnaHRfcmV0XzFfbWluJHJldF8xX21pbiwgbmEucm09VFJVRSkgI3N0YW5kYXJkIGRldmlhdGlvbiAoZXhjbHVkZXMgTkEgdmFsdWVzKQ0KDQoNCmBgYA0KDQpgYGB7ciBTVU1NQVJZIFRBQkxFIFdJVEggU1RBVElTVElDUyBSRVNVTFRTIERUfQ0KIyMgIENyZWF0ZSBTdW1tYXJ5IFRhYmxlDQoNCnN1bXRhYmxlIDwtIG1hdHJpeChjKG1heDEsIG1pbjEsIG1lYW4xLCBzZDEsIG1heDIsIG1pbjIsIG1lYW4yLCBzZDIsIG1heDUsIG1pbjUsIG1lYW41LCBzZDUsIG1heDEwLCBtaW4xMCwgbWVhbjEwLCBzZDEwLCBtYXgyMCwgbWluMjAsIG1lYW4yMCwgc2QyMCwgbWF4MzAsIG1pbjMwLCBtZWFuMzAsIHNkMzAsIG1heDYwLCBtaW42MCwgbWVhbjYwLCBzZDYwLCBtYXgxMjAsIG1pbjEyMCwgbWVhbjEyMCwgc2QxMjAsIG1heDI0MCwgbWluMjQwLCBtZWFuMjQwLCBzZDI0MCwgbWF4MzYwLCBtaW4zNjAsIG1lYW4zNjAsIHNkMzAsIG1heG9uLCBtaW5vbiwgbWVhbm9uLCBzZG9uKSwgbmNvbCA9IDQsIGJ5cm93ID0gVFJVRSkNCmNvbG5hbWVzKHN1bXRhYmxlKSA8LSBjKCJNYXgiLCAiTWluIiwgIk1lYW4iLCAiU3RkLiBEZXYiKQ0Kcm93bmFtZXMoc3VtdGFibGUpIDwtIGMoIjEgTWludXRlIiwgIjIgTWludXRlcyIsICI1IE1pbnV0ZXMiLCAiMTAgTWludXRlcyIsICIyMCBNaW51dGVzIiwgIjMwIE1pbnV0ZXMiLCAiNjAgTWludXRlcyIsICIxMjAgTWludXRlcyIsICIyNDAgTWludXRlcyIsICIzNjAgTWludXRlcyIsICJPdmVybmlnaHQiKQ0Kc3VtdGFibGUgPC0gYXMudGFibGUoc3VtdGFibGUpDQpzdW10YWJsZQ0KYGBgDQoNCg0KDQpgYGB7ciBISVNUT0dSQU1TfQ0KDQojIyBISVNUT0dSQU0gT0YgTUlOVVRFIEJZIE1JTlVURSBTVE9DSyBSRVRVUk5TDQoNCmhpc3QocmV0XzFfbWluJHJldF8xX21pbiwgDQogICAgIGJyZWFrcyA9IDUwMCwNCiAgICAgbWFpbiA9ICIxIE1pbnV0ZSBJbnRyYWRheSBSZXR1cm5zIiwNCiAgICAgeGxhYiA9ICJNaW51dGUgTGV2ZWwgUmV0dXJucyIsIA0KICAgICBjb2wgPSAiTGlnaHQgQmx1ZSIpDQoNCiMjICBISVNUT0dSQU0gT0YgT1ZFUk5JR0hUIFNUT0NLIFJFVFVSTlMNCg0KaGlzdChvdmVybmlnaHRfcmV0XzFfbWluJHJldF8xX21pbiwgDQogICAgIGJyZWFrcyA9IDEwMCwNCiAgICAgbWFpbiA9ICJPdmVybmlnaHQgUmV0dXJucyIsDQogICAgIHhsYWIgPSAiRW5kIG9mIFRyYWRpbmcgRGF5IHRvIEJlZ2lubmluZyBvZiBOZXh0IFRyYWRpbmcgRGF5IFJldHVybnMiLCANCiAgICAgY29sID0gIlJlZCIpDQoNCmBgYA0KDQpgYGB7ciBERU5TSVRZIFBMT1RTfQ0KDQojIyAgQ1JFQVRFIERFTlNJVFkgUExPVCBESVNUUklCVVRJT05TDQoNCmQxIDwtIGRlbnNpdHkocmV0XzFfbWluJHJldF8xX21pbiwgZnJvbSA9IC0wLjA1LCB0byA9IDAuMDUpDQpkMiA8LSBkZW5zaXR5KHJldF8yX21pbiRyZXRfMl9taW4sIGZyb20gPSAtMC4wNSwgdG8gPSAwLjA1KQ0KZDUgPC0gZGVuc2l0eShyZXRfNV9taW4kcmV0XzVfbWluLCBmcm9tID0gLTAuMDUsIHRvID0gMC4wNSkNCmQxMCA8LSBkZW5zaXR5KHJldF8xMF9taW4kcmV0XzEwX21pbiwgZnJvbSA9IC0wLjA1LCB0byA9IDAuMDUpDQpkMjAgPC0gZGVuc2l0eShyZXRfMjBfbWluJHJldF8yMF9taW4sIGZyb20gPSAtMC4wNSwgdG8gPSAwLjA1KQ0KZDMwIDwtIGRlbnNpdHkocmV0XzMwX21pbiRyZXRfMzBfbWluLCBmcm9tID0gLTAuMDUsIHRvID0gMC4wNSkNCmQ2MCA8LSBkZW5zaXR5KHJldF82MF9taW4kcmV0XzYwX21pbiwgZnJvbSA9IC0wLjA1LCB0byA9IDAuMDUpDQpkMTIwIDwtIGRlbnNpdHkocmV0XzEyMF9taW4kcmV0XzEyMF9taW4sIGZyb20gPSAtMC4wNSwgdG8gPSAwLjA1KQ0KZDI0MCA8LSBkZW5zaXR5KHJldF8yNDBfbWluJHJldF8yNDBfbWluLCBmcm9tID0gLTAuMDUsIHRvID0gMC4wNSkNCmQzNjAgPC0gZGVuc2l0eShyZXRfMzYwX21pbiRyZXRfMzYwX21pbiwgZnJvbSA9IC0wLjA1LCB0byA9IDAuMDUpDQpkb24gPC0gZGVuc2l0eShvdmVybmlnaHRfcmV0XzFfbWluJHJldF8xX21pbiwgbmEucm0gPSBUUlVFLCBmcm9tID0gLTAuMDUsIHRvID0gMC4wNSkgI0VYQ0xVREUgTkEgVkFMVUVTIEZST00gQU5BTFlTSVMgKEVSUk9SIFJFU1VMVFMgSUYgWU9VIERPTidUIERPIFRISVMpDQoNCg0KIyMgIFBMT1QgREVOU0lUWSBQTE9UUw0KDQpwbG90KGQxLCBtYWluID0gIkRlbnN0aXkgUGxvdDogMSBNaW51dGUgUmV0dXJucyIsIHhsYWIgPSAiRGlzdHJpYnV0aW9uIG9mIDEgTWludXRlIFJldHVybnMiKSANCnBvbHlnb24oZDEsIGNvbCA9ICJMaWdodCBCbHVlIiwgYm9yZGVyID0gIkJsdWUiKQ0KcGxvdChkMiwgbWFpbiA9ICJEZW5zdGl5IFBsb3Q6IDIgTWludXRlIFJldHVybnMiLCB4bGFiID0gIkRpc3RyaWJ1dGlvbiBvZiAyIE1pbnV0ZSBSZXR1cm5zIikNCnBvbHlnb24oZDIsIGNvbCA9ICJMaWdodCBCbHVlIiwgYm9yZGVyID0gIkJsdWUiKQ0KcGxvdChkNSwgbWFpbiA9ICJEZW5zdGl5IFBsb3Q6IDUgTWludXRlIFJldHVybnMiLCB4bGFiID0gIkRpc3RyaWJ1dGlvbiBvZiA1IE1pbnV0ZSBSZXR1cm5zIikNCnBvbHlnb24oZDUsIGNvbCA9ICJMaWdodCBCbHVlIiwgYm9yZGVyID0gIkJsdWUiKQ0KcGxvdChkMTAsIG1haW4gPSAiRGVuc3RpeSBQbG90OiAxMCBNaW51dGUgUmV0dXJucyIsIHhsYWIgPSAiRGlzdHJpYnV0aW9uIG9mIDEwIE1pbnV0ZSBSZXR1cm5zIikNCnBvbHlnb24oZDEwLCBjb2wgPSAiTGlnaHQgQmx1ZSIsIGJvcmRlciA9ICJCbHVlIikNCnBsb3QoZDIwLCBtYWluID0gIkRlbnN0aXkgUGxvdDogMjAgTWludXRlIFJldHVybnMiLCB4bGFiID0gIkRpc3RyaWJ1dGlvbiBvZiAyMCBNaW51dGUgUmV0dXJucyIpDQpwb2x5Z29uKGQyMCwgY29sID0gIkxpZ2h0IEJsdWUiLCBib3JkZXIgPSAiQmx1ZSIpDQpwbG90KGQzMCwgbWFpbiA9ICJEZW5zdGl5IFBsb3Q6IDMwIE1pbnV0ZSBSZXR1cm5zIiwgeGxhYiA9ICJEaXN0cmlidXRpb24gb2YgMzAgTWludXRlIFJldHVybnMiKQ0KcG9seWdvbihkMzAsIGNvbCA9ICJMaWdodCBCbHVlIiwgYm9yZGVyID0gIkJsdWUiKQ0KcGxvdChkNjAsIG1haW4gPSAiRGVuc3RpeSBQbG90OiA2MCBNaW51dGUgUmV0dXJucyIsIHhsYWIgPSAiRGlzdHJpYnV0aW9uIG9mIDYwIE1pbnV0ZSBSZXR1cm5zIikNCnBvbHlnb24oZDYwLCBjb2wgPSAiTGlnaHQgQmx1ZSIsIGJvcmRlciA9ICJCbHVlIikNCnBsb3QoZDEyMCwgbWFpbiA9ICJEZW5zdGl5IFBsb3Q6IDEyMCBNaW51dGUgUmV0dXJucyIsIHhsYWIgPSAiRGlzdHJpYnV0aW9uIG9mIDEyMCBNaW51dGUgUmV0dXJucyIpDQpwb2x5Z29uKGQxMjAsIGNvbCA9ICJMaWdodCBCbHVlIiwgYm9yZGVyID0gIkJsdWUiKQ0KcGxvdChkMjQwLCBtYWluID0gIkRlbnN0aXkgUGxvdDogMjQwIE1pbnV0ZSBSZXR1cm5zIiwgeGxhYiA9ICJEaXN0cmlidXRpb24gb2YgMjQwIE1pbnV0ZSBSZXR1cm5zIikNCnBvbHlnb24oZDI0MCwgY29sID0gIkxpZ2h0IEJsdWUiLCBib3JkZXIgPSAiQmx1ZSIpDQpwbG90KGQzNjAsIG1haW4gPSAiRGVuc3RpeSBQbG90OiAzNjAgTWludXRlIFJldHVybnMiLCB4bGFiID0gIkRpc3RyaWJ1dGlvbiBvZiAzNjAgTWludXRlIFJldHVybnMiKQ0KcG9seWdvbihkMzYwLCBjb2wgPSAiTGlnaHQgQmx1ZSIsIGJvcmRlciA9ICJCbHVlIikNCnBsb3QoZG9uLCBtYWluID0gIkRlbnN0aXkgUGxvdDogT3Zlcm5pZ2h0IFJldHVybnMiLCB4bGFiID0gIkRpc3RyaWJ1dGlvbiBvZiBPdmVybmlnaHQgUmV0dXJucyIpDQpwb2x5Z29uKGRvbiwgY29sID0gIkxpZ2h0IEdyZWVuIiwgYm9yZGVyID0gIkdyZWVuIikNCg0KYGBgDQoNCmBgYHtyfQ0KIyMgTE9BRCBUUlVNUCBUV0VFVFMNCg0KZHQgPC0gcmVhZC5jc3YoImR0X3R3ZWV0cy5jc3YiLCBzZXAgPSAiLCIsIGhlYWRlciA9IFRSVUUpDQpkdA0KDQpgYGANCg0KYGBge3IgVFJVTVAgVFdFRVQgREFUQSBQUk9GSUxJTkd9DQojIyAgREFUQSBQUk9GSUxJTkcgVVNJTkcgU1FMREYNCg0KIyMgIE51bWJlciBvZiBUd2VldHMgaW4gdGhlIERhdGEgU2V0DQpzcWxkZigiU0VMRUNUIENPVU5UKCopIEZST00gZHQiKQ0KDQpgYGANCg0KYGBge3IgQ09VTlQgT0YgVFdFRVRTIElOIC8gT1VUIE9GIFRSQURJTkcgSE9VUlN9DQoNCiMjICBOdW1iZXIgb2YgVHdlZXRzIER1cmluZyAvIE91dHNpZGUgb2YgVHJhZGluZyBIb3Vycw0Kc3FsZGYoIlNFTEVDVCBEVVJJTkdUUkFESU5HSE9VUlMsIENPVU5UKCopDQogICAgICBGUk9NIGR0DQogICAgICBHUk9VUCBCWSAxIikNCmBgYA0KDQpgYGB7ciBCQVIgUExPVCBPRiBUUlVNUFMgVFdFRVRTIFBFUiBIT1VSfQ0KDQoNCiMjICBOdW1iZXIgb2YgVHdlZXRzIFBlciBIb3VyIG9mIHRoZSBEYXkNCkRUMSA8LSBzcWxkZignU0VMRUNUIEhPVVIsIENPVU5UKCopIGFzIG51bXR3ZWV0cyANCiAgICAgIEZST00gZHQgDQogICAgICBHUk9VUCBCWSBob3VyJykNCg0KeCA8LSAwOjIzICMgTkVFREVEIElOIFBMT1QgQkVMT1cgVE8gQ1JFQVRFIFggQVhJUw0KDQpiYXJwbG90KERUMSRudW10d2VldHMsIA0KICAgICAgICBtYWluID0gIkRvbmFsZCBUcnVtcCBUd2VldHMgYnkgSG91ciBvZiB0aGUgRGF5IiwNCiAgICAgICAgeGxhYiA9ICJIb3VyIG9mIHRoZSBEYXkiLCANCiAgICAgICAgeWxhYiA9ICJOdW1iZXIgb2YgVHdlZXRzIiwNCiAgICAgICAgY29sID0gImxpZ2h0IGJsdWUiLA0KICAgICAgICBuYW1lcy5hcmcgPSBjKHgpLA0KICAgICAgICBjZXgubGFiPTEpDQpgYGANCg0KYGBge3J9DQoNCiMjIE51bWJlciBvZiBUd2VldHMgYnkgWWVhciBhbmQgTW9udGgNCkRUMiA8LSBzcWxkZignU0VMRUNUIFlFQVIsIE1PTlRILCBEQVRFLCBDT1VOVCgqKSBhcyBudW10d2VldHMNCiAgICAgIEZST00gZHQNCiAgICAgIEdST1VQIEJZIDEsIDIsIDMnKQ0KDQpwbG90KERUMiRudW10d2VldHMsdHlwZSA9ICJsIiwgDQogICAgIG1haW4gPSAiTnVtYmVyIG9mIFR3ZWV0cyBieSBEYXkiLCANCiAgICAgeGxhYiA9ICJEYXkiLCANCiAgICAgeWxhYiA9ICJOdW1iZXIgb2YgVHdlZXRzIiwgDQogICAgIGNvbCA9ICJCbHVlIikNCg0KYGBgDQoNCg==